/*
 * @Descripttion: 
 * @version: 
 * @Author: lily
 * @Date: 2021-05-17 10:42:14
 * @LastEditors: lily
 * @LastEditTime: 2021-05-17 11:22:55
 */
/*
 * @lc app=leetcode.cn id=189 lang=javascript
 *
 * [189] 旋转数组
 */

// @lc code=start
/**
 * @param {number[]} nums
 * @param {number} k
 * @return {void} Do not return anything, modify nums in-place instead.
 */
//  思想：
//  法二：翻转数组
//  先翻转所有元素，再分别翻转 0 ~ k-1 和 k ~ len-1 的部分
//  复杂度 O(n) O(1)

var rotate = function (nums, k) {
    k %= nums.length
    reverse(nums, 0, nums.length - 1);
    reverse(nums, 0, k - 1);
    reverse(nums, k, nums.length - 1);
};

var reverse = function (nums, start, end) {
    while (start < end) {
        [nums[start], nums[end]] = [nums[end], nums[start]]
        start++
        end--
    }
}
// @lc code=end


//  思想：
//  法一：使用额外数组
//  将原数组下标为 i 的元素放至新数组下标为 (i+k) mod n 处
//  复杂度 O(n) O(n)

var rotate1 = function (nums, k) {
    const len = nums.length
    // 深拷贝
    let copy = nums.slice()
    // 修改原数组
    for (let i = 0; i < len; i++) {
        nums[(k + i) % len] = copy[i]
    }
};


let nums = [1, 2, 3, 4, 5, 6, 7]
rotate1(nums, 3)
console.log(nums);
